﻿// Tischpreiskegeln
//
// vorgesehen für die FF Feichtenberg zur Unterstützung des alljährlich stattfindenen
// Tischpreiskegelns.
// 
// Autoren:
// Eder Philipp S0910438031
// Lutt Martin  S0910438076
// (FH Wels)
//
using System;
using System.Collections.Generic;
using System.Data;
//using System.Linq;
using System.Text;
using System.Data.Odbc;

namespace fff_preiskegeln
{
    public class dbVerbindung
    {
        #region Konstanten

        // Standardwerte für den ConnectionString
        //private const string DRIVER = "MySQL ODBC 5.1 Driver";
        //private const string SERVER = "10.49.100.61"; //"localhost";
        //private const string DATABASE = "preiskegeln";
        //private const string UID = "user";
        //private const string PW = "123456";
        //private const string OPTION = "3";

        #endregion

        #region Member

        private string myConString;
        private OdbcConnection myConnection;

        #endregion

        #region Konstruktoren

        /// <summary>
        /// Im Konsturktor wird die Datenbankverbindung angelegt und kurz geöffnet.
        /// </summary>
        /// <param name="driver">Driver für die Datenbankverbindung. Beispiel: "MySQL ODBC 5.1 Driver"</param>
        /// <param name="server">Der Pfad zum server auf dem die Datenbank liegt. Zum Beispiel die IP adresse</param>
        /// <param name="database">Der Datenbankname</param>
        /// <param name="uid">Der Benutzername zum Zugriff auf die Datenbank</param>
        /// <param name="password">Das Password zum Zugriff auf die Datenbank</param>
        /// <param name="option">Beispiel: "3"</param>
        public dbVerbindung(string driver, string server, string database, string uid, string password, string option)
        {
            //Verbindungs-String für MyODBC
            this.myConString = "DRIVER={" + driver + "};" +
                               "SERVER=" + server + ";" +
                               "DATABASE=" + database + ";" +
                               "UID=" + uid + ";" +
                               "PASSWORD=" + password + ";" +
                               "OPTION=" + option + ";";
            // Legt die Datenbankverbindung an und öffnet sie kurz
            this.Connect();
        }

        /// <summary>
        /// Im Konstruktor wird die Datenbankverbindung über den übergebenen ConnectionString angelegt und kurz geöffnet.
        /// </summary>
        /// <param name="connectionString">Die Verbindungszeichenfolge zum erstellen der Datenbankverbindung</param>
        public dbVerbindung(string connectionString)
        {
            this.myConString = connectionString;
            // Legt die Datenbankverbindung an und öffnet sie kurz
            this.Connect();
        }

        #endregion

        #region Private Methoden

        // 
        /// <summary>
        /// Legt die Verbindung an und testet ob sie sich öffnen lässt
        /// </summary>
        private void Connect()
        {
            // Verbindung anlegen
            this.myConnection = new OdbcConnection(this.myConString);
            // Verbindung Öffnen
            try
            {
                this.OpenConnection();
            }
            catch (Exception ex)
            {
                throw new Exception(
                    "Beim Öffnen der Datenbankverbindung ist ein Fehler aufgetretetn. Die Verbindung konnte nicht geöffnet werden.\n" +
                    ex.Message);
            }
            // Verbindung schleißen
            this.CloseConnection();
        }

        private void OpenConnection()
        {
            // Wenn Verbindung nicht geschlossen, die Verbindung schließen
            if (this.myConnection.State != ConnectionState.Closed)
            {
                this.myConnection.Close();
            }
            // Wenn verbindung geschlossen ist dann öffne sie
            if (this.myConnection.State == ConnectionState.Closed)
            {
                this.myConnection.Open();
                if (this.myConnection.State != ConnectionState.Open)
                {
                    throw new Exception("Datenbank konnte nicht geöffnet werden.\nConnection State = " +
                                    this.myConnection.State);
                }
            }
            // Sonst wirf einen Fehler
            else
            {
                throw new Exception("Datenbank kann nicht geschlossen werden.\nConnection State = " +
                                    this.myConnection.State);
            }
        }
        private void CloseConnection()
        {
            // Schließe Verbindung
            myConnection.Close();
            // Wenn Verbindung nicht geschlossen ist wirf einen Fehler
            if (this.myConnection.State != ConnectionState.Closed)
            {
                throw new Exception("Datenbank kann nicht geschlossen werden.\nConnection State = " +
                                    this.myConnection.State);
            }
        }

        #endregion

        #region Methoden zum Daten Einfügen

        /// <summary>
        /// Spielerdaten werden in die Datenbank eingefügt.
        /// Es wird die erstellte ID zurückgegeben damit im Anhang dann die Vereine in der Vereins-
        /// tabelle richtig eingefügt werden.
        /// </summary>
        /// <param name="famName">Familienname</param>
        /// <param name="vorname">Vorname</param>
        /// <param name="strasse">Strasse</param>
        /// <param name="hausnr">Hausnummer inklusive und falls vorhanden Erweiterungen zB 1 a, 3/4/5, ...</param>
        /// <param name="plz">Postleitzahl</param>
        /// <param name="ort">Wohnort</param>
        /// <param name="notiz">Irgendwelche Notizen über Person</param>
        public void PersonEingeben(
            string famName, 
            string vorname, 
            string strasse, 
            string hausnr, 
            int plz, 
            string ort, 
            string notiz)
        {
            // INSERT Befehl
            if (strasse == "")
            {
                strasse = null;
            }
            string command = "INSERT INTO `preiskegeln`.`tperson` (`Familienname`, `Vorname`, `Strasse`, `HausNr`,`PLZ`,`Ort`,`Notiz`)" +
                             "VALUES (" +
                             "'" + famName + "', '" + vorname + "', '" + strasse +
                             "', '" + hausnr + "', '" + plz + "', '" + ort + "', '" + notiz + "');";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Ein Verein wird in der Datenbank angelegt
        /// </summary>
        /// <param name="vereinsname">Der Name des Vereins</param>
        /// <param name="vereinsort">Der Vereinsort</param>
        public void VereinEingeben(
            string vereinsname, 
            string vereinsort)
        {
            // INSERT Befehl
            string command = "INSERT INTO `preiskegeln`.`tverein` (`Name`, `Ort`)" +
                             "VALUES (" +
                             "'" + vereinsname + "', '" + vereinsort + "');";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Zuordung vom Verein zu der Person
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <param name="idverein">ID des Vereins</param>
        public void VereineZuordnen(
            int idperson, 
            int idverein)
        {
            // INSERT Befehl
            string command = "INSERT INTO `preiskegeln`.`tperson_tverein` (`id_person`, `id_verein`)" +
                             "VALUES (" + idperson + ", " + idverein + ");";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Eine Tour wird in der Datenbank eingegeben und die offenen Touren um eins verringert
        /// </summary>
        /// <param name="idperson">ID der Person die schießt</param>
        /// <param name="zeit">Zeitpunkt der Toureingabe</param>
        /// <param name="schuss1">Erster Schuss 0 ... 10</param>
        /// <param name="schuss2">Zweiter Schuss 0 ... 10</param>
        /// <param name="schuss3">Dritter Schuss 0 ... 10</param>
        /// <param name="schuss4">Vierter Schuss 0 ... 10</param>
        /// <param name="schuss5">Fünfter Schuss 0 ... 10</param>
        public void TourEingeben(
            int idperson, 
            DateTime zeit, 
            int schuss1, 
            int schuss2, 
            int schuss3, 
            int schuss4, 
            int schuss5)
        {
            String format = "yyyy-MM-dd HH:mm:ss";
            string szeit = zeit.ToString(format);
            // INSERT Befehl der Schussfolge
            string command =
                "INSERT INTO `preiskegeln`.`tschussfolge` ( `Schuss1`, `Schuss2`, `Schuss3`, `Schuss4`, `Schuss5`, `Zeit`, `Person`)" +
                "VALUES ('" + schuss1 + "', '" + schuss2 + "', '" + schuss3 + "', '" + schuss4 +
                "', '" + schuss5 + "', '" + szeit + "', '" + idperson + "');";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            // geschossene Tour von den bezahlten Tour abziehen
            command = "UPDATE `preiskegeln`.`tperson` SET `Touren`= `Touren`-1 WHERE `id`= " + idperson + ";";
            myCommand = new OdbcCommand(command, myConnection);
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Die Anzahl der bezahlten Touren werden in der Datenbank zu den vorhandenen addiert.
        /// Falls der Spieler im Minus war und
        /// mit den bezahlten Touren genau auf 0 Touren kommt, dann soll er von der Anmeldeliste genommen werden.
        /// </summary>
        /// <param name="idPerson">ID des Spielers</param>
        /// <param name="AnzahlTouren">Anzahl bezahlter Touren</param>
        public void SpielerTourenanzahlEingeben(
            int idPerson, 
            int AnzahlTouren)
        {
            string command;
            OdbcCommand myCommand = new OdbcCommand("SELECT Touren FROM tperson WHERE id = '" + idPerson + "';", myConnection);
            this.OpenConnection();
            int AnzTouren = Convert.ToInt32(myCommand.ExecuteScalar());
            if ((AnzTouren + AnzahlTouren) == 0)
            {
                command = "UPDATE `preiskegeln`.`tperson` SET `Anmeldung` = 0 AND `Touren`= 0 WHERE `id`= " + idPerson + ";";
                myCommand = new OdbcCommand(command, myConnection);
                myCommand.ExecuteNonQuery();
            }
            command = "UPDATE `preiskegeln`.`tperson` SET `Touren`= `Touren`+ " + AnzahlTouren + " WHERE `id`= " + idPerson + ";";
            myCommand = new OdbcCommand(command, myConnection);
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }

        #endregion

        #region Methoden zum Daten Abfragen

        /// <summary>
        /// Gibt die ID der Person zurück, die gesucht wird.
        /// </summary>
        /// <param name="famName">Familienname der zu suchenden Person</param>
        /// <param name="vorname">Vorname der zu suchenden Person</param>
        /// <param name="adresse">Adresse der zu suchenden Person</param>
        /// <param name="notiz">Notiz der zu suchenden Person</param>
        /// <returns>Gibt die ID der entsprechenden Person zurück</returns>
        public int IDPersonAbfragen(
            string famName, 
            string vorname, 
            string strasse, 
            string ort,
            string hausnr,
            int plz,
            string notiz)
        {
            int idperson = 0;
            // Select Befehl
            OdbcCommand myCommand =
                new OdbcCommand(
                    "SELECT id FROM tperson WHERE Familienname LIKE '" + famName + "' AND Vorname LIKE '" + vorname +
                    "' AND Strasse LIKE '" + strasse + "' AND Ort LIKE '" + ort + "' AND HausNr LIKE '" + hausnr +
                    "' AND Notiz LIKE '" + notiz + "' AND PLZ = " + plz +
                    ";", myConnection);
            this.OpenConnection();
            // ID Abfragen
            idperson = Convert.ToInt32(myCommand.ExecuteScalar());
            this.CloseConnection();
            // ID Zurückgeben
            return (idperson);
        }
        /// <summary>
        /// Gibt einen DataTable mit allen Vereinen zurück
        /// </summary>
        /// <returns>der DataTable</returns>
        public DataTable AbfrageVereine()
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Vereine");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter = new OdbcDataAdapter("SELECT id, Name, Ort FROM tverein ORDER BY Name",
                                                              this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Sucht alle Spieler, welche mit den Touren im Plus oder im Minus sind und gibt diese in einem DataTable zurück
        /// </summary>
        /// <returns>DataTable</returns>
        public DataTable SpielerMitOffenenTouren()
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Spieler mit Offenen Touren");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT id, Familienname, Vorname, Touren FROM tperson WHERE Anmeldung > 0 ORDER BY Familienname",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Sucht alle Spieler, welche mit den Touren im Minus sind und gibt diese in einem DateaTable zurück
        /// </summary>
        /// <returns>DataTable</returns>
        public DataTable SpielerMitNegativenTouren()
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Spieler mit Negativen Touren");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT id, Familienname, Vorname, Touren FROM tperson WHERE Touren < 0 ORDER BY Familienname",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Sucht nach Personen mit Vorname ODER Nachname und gibt das Ergebniss in einem DataTable zurück
        /// </summary>
        /// <param name="famName">Familienname</param>
        /// <param name="vorName">Vorname</param>
        /// <returns></returns>
        public DataTable SpielerSucheFamilienname(
            string famName,
            string vorName)
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Spielerauswahl nach Familiennamen");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT id, Familienname, Vorname FROM tperson WHERE Familienname LIKE '%" + famName +
                    "%' AND Vorname LIKE '%" + vorName + "%' ORDER BY Familienname ASC;",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Sucht nach Vereinen mit Name ODER Ort und gibt das Ergebniss in einem DataTable zurück
        /// </summary>
        /// <param name="ort">Ort des Vereins</param>
        /// <param name="vereinsname">Name des Vereins</param>
        /// <returns>Tabelle mit Vereinen</returns>
        public DataTable VereinSuchen(
            string ort,
            string vereinsname)
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Vereine");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT id, Name, Ort FROM tverein WHERE Name LIKE '%" + vereinsname +
                    "%' AND Ort LIKE '%" + ort + "%' ORDER BY Name ASC;",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Gibt alle Spieler eines Jahres zurück
        /// </summary>
        /// <param name="jahr">Jahrgang</param>
        /// <returns>Alle Spieler eines Jahres</returns>
        public DataTable AlleSpielerEinesJahrgangs(int jahr)
        {
            DateTime datumende = new DateTime(jahr,12,31);
            DateTime datumanfang=new DateTime(jahr,1,1);
            // DataTable anlegen
            DataTable tabelle = new DataTable("Spielerauswahl nach Familiennamen pro Jahr");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT tperson.familienname, tperson.Vorname AS Anzahl FROM tperson" +
                    " INNER JOIN tschussfolge ON (tperson.id = tschussfolge.Person)" + 
                    " WHERE  Zeit < '" + datumende.Year + "-" + datumende.Month + "-" + datumende.Day + " 06:00:00' AND Zeit > '" +
                    datumanfang.Year + "-" + datumanfang.Month + "-" + datumanfang.Day +
                    " 06:00:01' GROUP BY tschussfolge.Person ORDER BY Anzahl DESC, tperson.familienname ASC;",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Gibt ein DataTable zurück, mit den Personen, geordnet nach ihrer Anzahl der eingegeben Touren
        /// </summary>
        /// <param name="datumanfang">Das Datum ab dem gesucht wird</param>
        /// <param name="datumende">Das Datum bis zu dem gesucht wird</param>
        /// <returns></returns>
        public DataTable Tourensieger(
            DateTime datumanfang, 
            DateTime datumende)
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Tourensieger");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter =
                new OdbcDataAdapter(
                    "SELECT tperson.familienname, tperson.Vorname, COUNT(tschussfolge.id) AS Anzahl FROM tperson INNER JOIN tschussfolge ON (tperson.id = tschussfolge.Person) WHERE  Zeit < '" +
                    datumende.Year + "-" + datumende.Month + "-" + datumende.Day + " 06:00:00' AND Zeit > '" +
                    datumanfang.Year + "-" + datumanfang.Month + "-" + datumanfang.Day +
                    " 06:00:01' GROUP BY tschussfolge.Person ORDER BY Anzahl DESC, tperson.familienname ASC;",
                    this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Gibt ein DataTable zurück, mit der Anzahl der Personen die während des angegebenen Zeitraums geschossen haben
        /// </summary>
        /// <param name="datumanfang">Zeitpunkt ab dem gesucht wird</param>
        /// <param name="datumende">Zeitpunkt bis zu dem gesucht wird</param>
        /// <returns></returns>
        public int SpielerAnzahlProEinheit(
            DateTime datumanfang,
            DateTime datumende)
        {
            int anzahl = 0;
            OdbcCommand myCommand =
                new OdbcCommand(
                    "SELECT COUNT(tschussfolge.id) AS Anzahl FROM tschussfolge " +
                    "WHERE  Zeit < '" +
                    datumende.Year + "-" + datumende.Month + "-" + datumende.Day + " " + datumende.Hour + ":" + datumende.Minute + "' AND Zeit > '" +
                    datumanfang.Year + "-" + datumanfang.Month + "-" + datumanfang.Day + " " + datumanfang.Hour + ":" + datumanfang.Minute +
                    "';", myConnection);
            this.OpenConnection();
            // ID Abfragen
            anzahl = Convert.ToInt32(myCommand.ExecuteScalar());
            this.CloseConnection();
            // ID Zurückgeben
            return (anzahl);
        }
        /// <summary>
        /// Gibt den Familiennamen zu der angegebenen ID zurück.
        /// </summary>
        /// <param name="idperson">Int ID der zu suchenden Person</param>
        /// <returns>String Familienname</returns>
        public string Familienname(int idperson)
        {
            // DataTable anlegen
            string famname = string.Empty;
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand = new OdbcCommand("SELECT Familienname FROM tperson WHERE id LIKE " + idperson + ";", myConnection);
            this.OpenConnection();
            famname = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            // DataTAble zurückgeben
            return (famname);
        }
        /// <summary>
        /// Gibt den Vornamen zu der angegebenen ID zurück.
        /// </summary>
        /// <param name="idperson">Int ID der zu suchenden Person</param>
        /// <returns>String Vorname</returns>
        public string Vorname(int idperson)
        {
            // DataTable anlegen
            string vorname = string.Empty;
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand = new OdbcCommand("SELECT Vorname FROM tperson WHERE id LIKE " + idperson + ";", myConnection);
            this.OpenConnection();
            vorname = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            // DataTAble zurückgeben
            return (vorname);
        }
        /// <summary>
        /// Fragt die Summe der geschossenen Punkte aller Schussfolgen eines bestimmten Zeitbereichs und einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <param name="aktdatum">Datum ab dem gesucht wird</param>
        /// <param name="datumMorgen">Datum bis zu dem gesucht wird</param>
        /// <returns>Array, im Index 0 steht die Anzahl der geschossenen 1er; im Index 49 steht die Anzahl der geschossenen 50er</returns>
        public int[] schussfolge(int idperson, DateTime aktdatum, DateTime datumMorgen)
        {
            int[] schussfolge = new int[50];
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand =
                new OdbcCommand(
                    "SELECT Schuss1, Schuss2, Schuss3, Schuss4, Schuss5 FROM tschussfolge WHERE person LIKE " + idperson +
                    " AND Zeit < '" + datumMorgen.Year + "-" + datumMorgen.Month + "-" + datumMorgen.Day +
                    " 06:00:00' AND Zeit > '" + aktdatum.Year + "-" + aktdatum.Month + "-" + aktdatum.Day +
                    " 06:00:01';", myConnection);
            this.OpenConnection();
            OdbcDataReader reader = myCommand.ExecuteReader();
            int i = 0;
            Queue<int> tour = new Queue<int>();
            while(reader.Read())
            {
                int summe = 0;
                // Die fünf Schüsse summieren
                for (int j = 0; j < 5; j++)
                {
                    summe += Convert.ToInt32(reader[j]);
                }
                tour.Enqueue(summe);
                i++;
            }
            this.CloseConnection();
            while (tour.Count > 0)
            {
                int schuss = tour.Dequeue();
                if ((schuss > 0) && (schuss <= 50))
                {
                    schussfolge[schuss - 1]++;             
                }
            }
            return (schussfolge);
        }
        /// <summary>
        /// Gitbt ein Array mit den IDs aller Personen in der Datenbank zurück
        /// </summary>
        /// <returns>Array mit den IDs</returns>
        public int[] alleIDs()
        {
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand = new OdbcCommand("SELECT id FROM tperson", myConnection);
            this.OpenConnection();
            OdbcDataReader reader = myCommand.ExecuteReader();
            Queue<int> ids = new Queue<int>();
            while (reader.Read())
            {
                ids.Enqueue(Convert.ToInt32(reader[0]));
            }
            this.CloseConnection();
            return (ids.ToArray());
        }
        /// <summary>
        /// Gibt alle IDs der Personen die in einem bestimmten Zeitraum geschossen haben zurück
        /// </summary>
        /// <param name="aktdatum">Datum ab dem gesucht wird</param>
        /// <param name="datumMorgen">Datum bis zu dem gesucht wird</param>
        /// <returns>Array mit den IDs</returns>
        public int[] alleIDsProTag(
            DateTime aktdatum, 
            DateTime datumMorgen)
        {
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand =
                new OdbcCommand(
                    "SELECT DISTINCT( Person ) FROM tschussfolge WHERE Zeit < '" + datumMorgen.Year + "-" +
                    datumMorgen.Month + "-" + datumMorgen.Day + " 06:00:00' AND Zeit > '" + aktdatum.Year + "-" +
                    aktdatum.Month + "-" + aktdatum.Day + " 06:00:01';", myConnection);
            this.OpenConnection();
            OdbcDataReader reader = myCommand.ExecuteReader();
            Queue<int> ids = new Queue<int>();
            while (reader.Read())
            {
                ids.Enqueue(Convert.ToInt32(reader[0]));
            }
            this.CloseConnection();
            return (ids.ToArray());
        }
        /// <summary>
        /// Gibt den vollen Namen einer Person zurück
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>String mit den Vollen Namen (Familienname + Vorname)</returns>
        public string name(int idperson)
        {
            string name = "";
            name = this.Familienname(idperson) + " " + this.Vorname(idperson);
            return (name);
        }
        /// <summary>
        /// Gibt die Adresse einer Person zurück
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>String mit der Adresse</returns>
        public string adresse(int idperson)
        {
            string adresse = "";
            adresse=this.Strasse(idperson) + " " + this.HausNr(idperson) + "\n" + this.PLZ(idperson) + " " + this.Ort(idperson);
            return (adresse);
        }
        /// <summary>
        /// Fragt die Strasse der Adresse einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>Strasse</returns>
        public string Strasse(int idperson)
        {
            string strasse = string.Empty;
            OdbcCommand myCommand = new OdbcCommand("SELECT Strasse FROM tperson WHERE id = " + idperson + ";", myConnection);
            this.OpenConnection();
            strasse = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            return (strasse);
        }
        /// <summary>
        /// Fragt die Hausnummer der Adresse einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>Hausnummer</returns>
        public string HausNr(int idperson)
        {
            string hausnr = string.Empty;
            OdbcCommand myCommand = new OdbcCommand("SELECT Hausnr FROM tperson WHERE id = " + idperson + ";", myConnection);
            this.OpenConnection();
            hausnr = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            return (hausnr);
        }
        /// <summary>
        /// Fragt die Postleitzahl der Adresse einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>die Postleitzahl der Person</returns>
        public string PLZ(int idperson)
        {
            string plz = string.Empty;
            OdbcCommand myCommand = new OdbcCommand("SELECT PLZ FROM tperson WHERE id = " + idperson + ";", myConnection);
            this.OpenConnection();
            plz = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            return (plz);
        }
        /// <summary>
        /// Fragt den Ort der Adressse einer Perosn ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns></returns>
        public string Ort(int idperson)
        {
            string ort = string.Empty;
            OdbcCommand myCommand = new OdbcCommand("SELECT Ort FROM tperson WHERE id = " + idperson + ";", myConnection);
            this.OpenConnection();
            ort = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            return (ort);
        }
        /// <summary>
        /// Fragt die Sonstigen Notizen einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>Die Sonstigen Notizen</returns>
        public string Sonstiges(int idperson)
        {
            string sonstiges = string.Empty;
            OdbcCommand myCommand = new OdbcCommand("SELECT Notiz FROM tperson WHERE id = " + idperson + ";", myConnection);
            this.OpenConnection();
            sonstiges = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            return (sonstiges);
        }
        /// <summary>
        /// Fragt die Vereine einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>Ein String mit allen Vereinen</returns>
        public string VereineVonEinerID(int idperson)
        {
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand =
                new OdbcCommand(
                    "SELECT Name, Ort FROM preiskegeln.tverein INNER JOIN preiskegeln.tperson_tverein ON tperson_tverein.id_verein=tverein.id WHERE tperson_tverein.id_person= '" +
                    idperson + "';", myConnection);
            this.OpenConnection();
            OdbcDataReader reader = myCommand.ExecuteReader();
            Queue<string> vereine = new Queue<string>();
            while (reader.Read())
            {
                vereine.Enqueue(Convert.ToString(reader[0]));
                vereine.Enqueue(Convert.ToString(reader[1]));
            }
            this.CloseConnection();
            string vereinstring = string.Empty;
            for (int i = 0; i < vereine.Count; i++)
            {
                vereinstring += "- " + vereine.Dequeue() + " " + vereine.Dequeue() + "\n";
            }
            return (vereinstring);
        }
        /// <summary>
        /// Fragt die Vereine einer Person ab
        /// </summary>
        /// <param name="idperson">ID der Person</param>
        /// <returns>Ein DataTable mit allen Vereinen</returns>
        public DataTable VereineVonEinerIDTable(int idperson)
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Vereine");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter = 
                new OdbcDataAdapter("SELECT id, Name, Ort FROM preiskegeln.tverein INNER JOIN preiskegeln.tperson_tverein " +
                    " ON tperson_tverein.id_verein=tverein.id WHERE tperson_tverein.id_person= '" +
                                                                                  idperson + "';", myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Gibt einen DataTable mit allen Schussfolgen einer Person zurück
        /// </summary>
        /// <param name="idPerson">ID der Person</param>
        /// <returns>DataTable</returns>
        public DataTable AlleSchussfolgenVonEinerID(int idPerson)
        {
            // DataTable anlegen
            DataTable tabelle = new DataTable("Schussfolgen");
            // DataAdapert mit SQL Abfragebefehl
            this.OpenConnection();
            OdbcDataAdapter dataAdapter = new OdbcDataAdapter("SELECT  Zeit, Schuss1, Schuss2, Schuss3, Schuss4, Schuss5, id FROM tschussfolge WHERE Person =" + idPerson + " ORDER BY Zeit DESC;",
                                                              this.myConnection);
            // Abfrage durchführen und daten in DataTable füllen
            dataAdapter.Fill(tabelle);
            this.CloseConnection();
            // DataTAble zurückgeben
            return (tabelle);
        }
        /// <summary>
        /// Fragt die Log In Daten ab
        /// </summary>
        /// <param name="username">Benutzername</param>
        /// <param name="password">Password als OUT Parameter</param>
        /// <param name="bereich">Berechtigter Bereich als OUT Parameter</param>
        public void Password(string username, out string password, out int bereich)
        {
            // Abfrage durchführen und daten in DataTable füllen
            OdbcCommand myCommand = new OdbcCommand("SELECT PW FROM tZugang WHERE User LIKE '" + username + "';", myConnection);
            this.OpenConnection();
            password = Convert.ToString(myCommand.ExecuteScalar());
            this.CloseConnection();
            // Abfrage durchführen und daten in DataTable füllen
            myCommand = new OdbcCommand("SELECT Bereich FROM tZugang WHERE User LIKE '" + username + "';", myConnection);
            this.OpenConnection();
            bereich = Convert.ToInt32(myCommand.ExecuteScalar());
            this.CloseConnection();
        }

        #endregion

        #region Methoden zum Daten aktualisieren
        /// <summary>
        /// Aktualisiert die ganzen persönlichen Daten in der Tabelle tperson
        /// </summary>
        /// <param name="famName">Familienname</param>
        /// <param name="vorname">Vorname</param>
        /// <param name="strasse">Strasse</param>
        /// <param name="hausnr">Hausnummer</param>
        /// <param name="plz">Postleitzahl</param>
        /// <param name="ort">Ort</param>
        /// <param name="notiz">Notizen über die Person</param>
        /// <param name="id">ID der Person</param>
        public void PersonAktualisieren(
            string famName,
            string vorname,
            string strasse,
                string hausnr,
            int plz,
            string ort,
            string notiz,
                int id)
        {
            // UPDATE Befehl
            string command = "UPDATE `preiskegeln`.`tperson` SET Familienname='" + famName + "', Vorname='" + vorname + "', Strasse='" + strasse + "', HausNr='" + hausnr + "', PLZ=" + plz + ",Ort='" + ort + "',Notiz='" + notiz + "' WHERE id=" + id + ";";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Es wird der in der Tabelle der Spieler mit der angeführten ID die Anmeldung auf 1 gesetzt
        /// ==> Der Spieler ist dann lt System angemeldet zum Schießen
        /// </summary>
        /// <param name="idPerson">ID der Spielers</param>
        public void SpielerAnmelden(int idPerson)
        {
            // SQL Befehl
            string command = "UPDATE `preiskegeln`.`tperson` SET `Anmeldung` = 1 WHERE `id`= " + idPerson + ";";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Es wird der in der Tabelle der Spieler mit der angeführten ID die Anmeldung auf 0 gesetzt
        /// ==> Der Spieler ist dann lt System abgemeldet zum Schießen
        /// </summary>
        /// <param name="idPerson">ID der Spielers</param>
        public void SpielerAbmelden(int idPerson)
        {
            // SQL Befehl
            string command = "UPDATE `preiskegeln`.`tperson` SET `Anmeldung` = 0 WHERE `id`= " + idPerson + ";";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        /// <summary>
        /// Aktualisiert die Zuordnungstabelle tperson_tverein
        /// Die Vereine in denen die PErson Mitglied ist werden aktualisiert
        /// </summary>
        /// <param name="verein">Vereine in denen die Person Mitglied ist</param>
        /// <param name="id">ID der Person</param>
        public void VereineAktualisieren(
            int[] verein,
                int id)
        {
            this.OpenConnection();
            // SQL Befehl
            string command = "DELETE FROM tperson_tverein WHERE id_person="+id+";";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            myCommand.ExecuteNonQuery();
            for (int i = 0; i < verein.Length; i++)
            {
                this.VereineZuordnen(id, verein[i]);
            }
            this.CloseConnection();
        }
        public void SchussfolgenAktualisieren(
            int[] schuss,
                int id)
        {
            // SQL Befehl
            string command = "UPDATE `preiskegeln`.`tschussfolge` SET `Schuss1` = " + schuss[0] + ", `Schuss2` = " + schuss[1] + 
                ", `Schuss3` = " + schuss[2] + ", `Schuss4` = " + schuss[3] + ", `Schuss5` = " + schuss[4] + " WHERE `id`= " + id + ";";
            // MySQL Befehl ausführen
            OdbcCommand myCommand = new OdbcCommand(command, myConnection);
            this.OpenConnection();
            myCommand.ExecuteNonQuery();
            this.CloseConnection();
        }
        #endregion

        #region Eigenschaften

        // Connections String (nur lesend)
        public string MyConString
        {
            get
            {
                return (this.myConString);
            }
        }

        #endregion

    }
}
